//导入工具包 require('node_modules里对应模块')
var gulp = require('gulp'), //本地安装gulp所用到的地方
    less = require('gulp-less'),
    cssmin=require("gulp-clean-css"),
    imagemin = require('gulp-imagemin'),
    pngquant = require('imagemin-pngquant'),//深度压缩图片
    cache = require('gulp-cache'),//只压缩修改的图片。
    uglify = require('gulp-uglify'),//压缩js
    autoprefixer = require('gulp-autoprefixer'), // gulp-autoprefixer根据设置浏览器版本自动处理浏览器前缀
    browserSync = require('browser-sync').create(),
    concat=require('gulp-concat');
var reload=browserSync.reload;

//定义一个testLess任务（自定义任务名称）
gulp.task('outputCss', function () {
  gulp.src('public/stylesheets/*.less') //该任务针对的文件
  .pipe(less()) //该任务调用的模块
  .pipe(gulp.dest('public/')); //将会在src/css下生成index.css
});

gulp.task('cssmin',function () {
  gulp.src('public/*.css')
  .pipe(concat('index.min.css'))
  .pipe(autoprefixer({
      browsers: ['last 2 versions', 'Android >= 4.0'],
      cascade: true, //是否美化属性值 默认：true 像这样：
      //-webkit-transform: rotate(45deg);
      //        transform: rotate(45deg);
      remove:true //是否去掉不必要的前缀 默认：true
  }))
  .pipe(cssmin({
    advanced: false,//类型：Boolean 默认：true [是否开启高级优化（合并选择器等）]
    compatibility: 'ie7',//保留ie7及以下兼容写法 类型：String 默认：''or'*' [启用兼容模式； 'ie7'：IE7兼容模式，'ie8'：IE8兼容模式，'*'：IE9+兼容模式]
    keepBreaks: false,//类型：Boolean 默认：false [是否保留换行]
    keepSpecialComments: '*'
    //保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀，如果不加这个参数，有可能将会删除你的部分前缀
  }))
  .pipe(gulp.dest('public/min/'));
});

gulp.task('jsmin', function () {
    //压缩src/js目录下的所有js文件
    //除了test1.js和test2.js（**匹配src/js的0个或多个子文件夹）
  // gulp.src(['public/javascripts/*.js', '!src/js/**/{test1,test2}.js'])
  gulp.src('public/*.js')
    .pipe(concat('index.min.js'))
    .pipe(uglify({
      //mangle: true,//类型：Boolean 默认：true 是否修改变量名
      mangle: {except: ['require' ,'exports' ,'module' ,'$']},//排除混淆关键字
      compress: true,//类型：Boolean 默认：true 是否完全压缩
      // preserveComments: 'all' //保留所有注释 默认不保留
  }))
  .pipe(gulp.dest('public/min/'));
});

gulp.task('imagemin',function() {
  gulp.src('public/images/*.{png,jpg,gif,ico,PNG}')
  .pipe(cache(imagemin({
    optimizationLevel: 5, //类型：Number  默认：3  取值范围：0-7（优化等级）
    progressive: true, //类型：Boolean 默认：false 无损压缩jpg图片
    interlaced: true, //类型：Boolean 默认：false 隔行扫描gif进行渲染
    multipass: true ,//类型：Boolean 默认：false 多次优化svg直到完全优化
    svgoPlugins: [{removeViewBox: false}],//不要移除svg的viewbox属性
    use: [pngquant()] //使用pngquant深度压缩png图片的imagemin插件
  })))
  .pipe(gulp.dest('public/img'));
});
// 已经集成到压缩css的task里面了
gulp.task('autoFx', function () {
    gulp.src('public/javascripts/*.css')
        .pipe(autoprefixer({
            browsers: ['last 2 versions', 'Android >= 4.0'],
            cascade: true, //是否美化属性值 默认：true 像这样：
            //-webkit-transform: rotate(45deg);
            //        transform: rotate(45deg);
            remove:true //是否去掉不必要的前缀 默认：true
            // browsers的取值如下：
            // ● last 2 versions: 主流浏览器的最新两个版本
            // ● last 1 Chrome versions: 谷歌浏览器的最新版本
            // ● last 2 Explorer versions: IE的最新两个版本
            // ● last 3 Safari versions: 苹果浏览器最新三个版本
            // ● Firefox >= 20: 火狐浏览器的版本大于或等于20
            // ● iOS 7: IOS7版本
            // ● Firefox ESR: 最新ESR版本的火狐
            // ● > 5%: 全球统计有超过5%的使用率
        }))
        .pipe(gulp.dest('dist/css'));
});
// 静态服务器
gulp.task('browser-sync', function() {
    browserSync.init({
        server: {
            baseDir: "./"
        }
    });
});
// 代理
gulp.task('browser-sync', function() {
    browserSync.init({
        proxy: "你的域名或IP"
    });
});

// 浏览器自动重载start

    // 创建一个任务确保JS任务完成之前能够继续响应
    // 浏览器重载
    gulp.task('js-watch',['js'],browserSync.reload);
    gulp.task('css-watch',['css'],browserSync.reload);
    // 使用默认任务启动Browsersync，监听JS文件,压缩文件在刷新前后不好把握，，
    gulp.task('server-default',['css','js'],function(){
      // 从这个项目的根目录启动服务器
      var files=['**/*.html','**/*.css','**/*.js'];
      browserSync.init(files,{
        server: "./"
      });

      // 添加 browserSync.reload 到任务队列里
        // 所有的浏览器重载后任务完成。
        gulp.watch("public/*.css", ['cssmin']);
        gulp.watch("public/*.js", ['jsmin']);
    });

// 浏览器自动重载end


// less编译后的css将注入到浏览器里实现更新
gulp.task('css', function () {
  var fileName="index";
    return gulp.src('public/*.css')
        .pipe(concat(fileName+'.min.css'))
        .pipe(autoprefixer({
            browsers: ['last 2 versions', 'Android >= 4.0'],
            cascade: true, //是否美化属性值 默认：true 像这样：
            //-webkit-transform: rotate(45deg);
            //        transform: rotate(45deg);
            remove:true //是否去掉不必要的前缀 默认：true
        }))
        .pipe(cssmin({
            advanced: false,//类型：Boolean 默认：true [是否开启高级优化（合并选择器等）]
            compatibility: 'ie7',//保留ie7及以下兼容写法 类型：String 默认：''or'*' [启用兼容模式； 'ie7'：IE7兼容模式，'ie8'：IE8兼容模式，'*'：IE9+兼容模式]
            keepBreaks: false,//类型：Boolean 默认：false [是否保留换行]
            keepSpecialComments: '*'
            //保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀，如果不加这个参数，有可能将会删除你的部分前缀
        }))
        .pipe(gulp.dest('public/min/'))
        .pipe(reload({stream:true})); //浏览器重载不需要，手动重载需要
});

// 处理完JS文件后返回流
gulp.task('js', function () {
    //压缩src/js目录下的所有js文件
    //除了test1.js和test2.js（**匹配src/js的0个或多个子文件夹）
  // gulp.src(['public/javascripts/*.js', '!src/js/**/{test1,test2}.js'])
  var fileName="index";
  return gulp.src('public/*.js')
        .pipe(concat(fileName+'.min.js'))
        .pipe(uglify({
          //mangle: true,//类型：Boolean 默认：true 是否修改变量名
          mangle: {except: ['require' ,'exports' ,'module' ,'$']},//排除混淆关键字
          compress: true,//类型：Boolean 默认：true 是否完全压缩
          // preserveComments: 'all' //保留所有注释
        }))
        .pipe(gulp.dest('public/min'))
        .pipe(reload({stream:true}));//浏览器重载不需要，手动重载需要
});
// js合并为一个文件
gulp.task('onejs',function(){
	var srcFile=[];
	srcFile.push('public/index.js');
	srcFile.push('public/test.js');
	var filename='alljs';
	var filepath='public/min/';
	gulp.src(srcFile).pipe(concat(filename+'.js')).pipe(gulp.dest(filepath));
	gulp.src(srcFile).pipe(concat(filename+'.min.js')).pipe(uglify()).pipe(gulp.dest(filepath));

});
// 静态服务器 + 监听 lesss/html 文件

//手动重载 （myself）使用默认任务启动Browsersync，监听JS文件
gulp.task('server', ['css','js'], function() {
  // 从这个项目的根目录启动服务器
  browserSync.init({
    server: "./"
  });
  //  添加 browserSync.reload 到任务队列里
  // 所有的浏览器重载后任务完成。
  gulp.watch("public/*.css", ['css']);
  gulp.watch("public/*.js", ['js']);
  gulp.watch("**/*.html").on('change', reload);
});
//用于压缩nodejs项目的
gulp.task('nodejs',['cssmin','jsmin'],function(){
  gulp.watch("public/*.css", ['cssmin']);
  gulp.watch("public/*.js", ['jsmin']);
});

//gulp onejs 手动合并js
gulp.task('default',['server']); //定义默认任务 elseTask为其他任务，该示例没有定义elseTask任务
 //定义默认任务 elseTask为其他任务，该示例没有定义elseTask任务
// gulp.task('norefrash',['jsmin','cssmin','imagemin']); //不会监视变化,也不刷新
// gulp.task('default',['outputCssmin']); //定义默认任务 elseTask为其他任务，该示例没有定义elseTask任务

//gulp.task(name[, deps], fn) 定义任务  name：任务名称 deps：依赖任务名称 fn：回调函数
//gulp.src(globs[, options]) 执行任务处理的文件  globs：处理的文件路径(字符串或者字符串数组)
//gulp.dest(path[, options]) 处理完后文件生成路径
